RustでGUIプログラミング – Icedでtourを触りつつ日本語表示対応をしてみた
はじめに
Rustを使ってみて、実行ファイル形式はやはり手軽だなーと感じるこの頃です。ただ、毎回ターミナル上での操作となるので「たまにはフォーム形式でやってみたい」と思いました。
RustにもGUIのライブラリが幾つかあり、そのうちの一つIcedを弄ってみることにしました。
Icedを選んだワケ
知名度があると思われるRustのGUIライブラリとして、conrod、druid、OrbTk、azul等があります。それぞれに特徴がありつつも、日本語が十二分に使えるのはconrodのみのようです。
ですが、上記記事にてconrod版を軽快に動かしたい場合に推奨されているvulkanは、MacOSの場合だと動作環境の都合でmetalにする必要があります。
他に何かないかなと検索してみたところ、実践Rustプログラミング入門の中身検索にてIcedを見つけました。クロスプラットフォーム対応により1つの説明で色々カバーできそうという点にて今回の選択としています。
チュートリアルをやってみる
GUIプログラミングは「とても難しそう」という感想がでてきそうですが、こなれたGUI用ライブラリを使えばそんなことはありません。
リポジトリのREADMEにかかれているサンプルコードは不足している点もあり動作しません。examples/
以下のコードを使ってみましょう。
tourを動かす
たくさんのサンプルがありますが、Icedができることを見る場合にはtourで十分でしょう。
git clone [email protected]:hecrj/iced.git cd iced/ cargo run --package tour
操作可能なデモが始まります。
そのうちの一つに日本語を入力すると文字化けするデモがあります。
正常表示されるように日本語対応してみましょう。
tourを日本語表示対応してみる
上記issueを参考に、日本語用フォントをダウンロードしてソースコードにて参照させます。
今回は個人・商用サイトで無料利用可能なマメロン Hi-Regularにしました。
ダウンロード後、tour内にfontsディレクトリを追加してコピーします。
% mkdir examples/tour/fonts/ % cp ~/Downloads/mamelon_hireg/Mamelon-5-Hi-Regular.otf examples/tour/fonts/
次にsrc/main.rs
に手を入れます。
% vim examples/tour/src/main.rs pub fn main() -> iced::Result { env_logger::init(); - Tour::run(Settings::default()) + Tour::run(Settings { + default_font: Some(include_bytes!("../fonts/Mamelon-5-Hi-Regular.otf")), + ..Settings::default() + }) }
再度デモを実行しましょう。
文字が正常に表示されました。
その他のサンプル
todoやQRコードジェネレータ等、実用に近いサンプルも多数あります。実行はtourと同じく以下のコマンドで可能です。
cargo run --package <sample>
日本語を使いたい場合には同様に設定が必要です。
あとがき
MacOSによるGUIアプリケーションの作成はXCodeによるObjective-C開発の頃から時折触っていましたが、個人的に馴染みにくく感じていました。Rustでのプログラミングに慣れてきたら、Iced等を使ったGUIプログラミングに手を出してみると出来る事の幅が広がるかもしれません。
conrodについても少し触ってみましたが、現時点でmetalを用いてのビルドは未達の状態です。ビルドに成功したら記事として挙げてみようと思います。
参考リンク
- Does not support chinese? · Issue #213 · hecrj/iced - https://github.com/
- もじワク研究 | マメロン Hi Regular | オリジナル日本語フォント - https://moji-waku.com/
- hecrj/iced: A cross-platform GUI library for Rust, inspired by Elm - https://github.com/
- さいきん試した Rust の GUI Toolkit 的な crate たちと日本語アプリでの実用性のメモ - C++ ときどき ごはん、わりとてぃーぶれいく☆ - https://usagi.hatenablog.jp/